home *** CD-ROM | disk | FTP | other *** search
/ MIDICraft's MIDINET CD-ROM / MIDICraft's MIDINET CD-ROM.iso / DOSUTILS / KORG / HEARI3.CPP < prev    next >
C/C++ Source or Header  |  1996-11-29  |  3KB  |  181 lines

  1. // heari3: see if korg is responding
  2. #include <stdio.h>
  3. #include <conio.h>
  4. #include <string.h>
  5. #include <ctype.h>
  6. #include <time.h>
  7. #include "sb.hpp"
  8. #include "mpu.hpp"
  9. #include <stdlib.h>
  10.  
  11. Soundcard* card = 0;
  12. int copy = 0;
  13. int dump = 1;
  14.  
  15. unsigned char mapchannel[16] = {
  16.   0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15
  17. };
  18.  
  19. unsigned char ignorelow[16] = {
  20.   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
  21. };
  22.  
  23. #define ISLOW(note)  (note <= 0x36)
  24.  
  25. int hear()
  26. {
  27.   card->reset();
  28.   unsigned char c;
  29.   int ret = 0;
  30.   int col = 0;
  31.   unsigned char checklow = 0;
  32.  
  33.   fprintf(stderr, "send midi commands from external keyboard:\n");
  34.   card->startinput();
  35.   while (1)
  36.   {
  37.     int count = card->hear(&c, 1);
  38.     if (count <= 0)
  39.     {
  40.       if (kbhit() && getch() == 27)
  41.     break;
  42.       continue;
  43.     }
  44.     ret = 1;
  45.     if (c == 0xFE)
  46.     {
  47.       if (kbhit() && getch() == 27)
  48.     break;
  49.       if (dump)
  50.       {
  51.     putchar('°');
  52.     col++;
  53.       }
  54.     }
  55.     else if (c == 0xF8)
  56.     {
  57.       if (kbhit() && getch() == 27)
  58.     break;
  59.       if (dump)
  60.       {
  61.     putchar('.');  // tick
  62.     col++;
  63.       }
  64.     }
  65.     else
  66.     {
  67.       if (copy)
  68.       {
  69.     if (checklow)
  70.     {
  71.       if (ISLOW(c))
  72.       {
  73.         checklow = (checklow & 15) + 0x80; // note off
  74.         c = 0;
  75.       }
  76.       card->play(&checklow, 1);
  77.     }
  78.     checklow = 0;
  79.     if (c & 0x80 && c < 0xF0)
  80.     {
  81.       int ch = c & 15;
  82.       if (mapchannel[ch] != c)
  83.       {
  84.         c = (c & 0xF0) + mapchannel[ch];
  85.         ch = c & 15;
  86.       }
  87.       if ((c & 0x80) <= 0x90 && ignorelow[ch])
  88.       {
  89.         checklow = c;
  90.       }
  91.     }
  92.     card->play(&c, 1);
  93.       }
  94.       if (dump)
  95.       {
  96.     if (c & 0x80)
  97.     {
  98.       if (dump)
  99.         putchar('\n');
  100.       col = 0;
  101.     }
  102.     else
  103.     {
  104.       if (dump)
  105.         putchar(' ');
  106.       col++;
  107.     }
  108.     printf("%02X", c);
  109.     col += 2;
  110.       }
  111.     }
  112.     if (dump && col >= 75)
  113.     {
  114.       putchar('\n');
  115.       col = 0;
  116.     }
  117.   }
  118.   card->stopinput();
  119.   return ret;
  120. }
  121.  
  122.  
  123. int main(int argc, char** argv)
  124. {
  125.   argc--; argv++;
  126.   while (argc > 0 && **argv == '-')
  127.   {
  128.     if (strnicmp(*argv, "-help", 2) == 0)
  129.     {
  130.       fprintf(stderr, "usage: heari3 [-copy] [-nodump] [-drum #]\n");
  131.       return 1;
  132.     }
  133.     if (strnicmp(*argv, "-copy", 2) == 0)
  134.     {
  135.       copy = 1;
  136.       argc--; argv++; continue;
  137.     }
  138.     if (strnicmp(*argv, "-drum", 2) == 0)
  139.     {
  140.       argc--; argv++;
  141.       if (argc > 0)
  142.       {
  143.     int ch = atoi(*argv); argc--; argv++;
  144.     if (ch >= 1 && ch <= 16)
  145.       mapchannel[ch-1] = 9;
  146.       }
  147.       continue;
  148.     }
  149.     if (strnicmp(*argv, "-nodump", 2) == 0)
  150.     {
  151.       dump = 0;
  152.       argc--; argv++; continue;
  153.     }
  154.     if (strnicmp(*argv, "-ignorelow", 2) == 0)
  155.     {
  156.       argc--; argv++;
  157.       if (argc > 0)
  158.       {
  159.     int ch = atoi(*argv); argc--; argv++;
  160.     if (ch >= 1 && ch <= 16)
  161.       ignorelow[ch-1] = 1;
  162.       }
  163.       continue;
  164.     }
  165.     fprintf(stderr, "invalid option %s\n", *argv);
  166.     argc--; argv++;
  167.   }
  168.   card = detect_soundcard();
  169.   if (!card)
  170.   {
  171.     fprintf(stderr, "Could not detect soundcard\n");
  172.     return 1;
  173.   }
  174.  
  175.   if (!hear())
  176.     fprintf(stderr, "no response from soundcard\n");
  177.  
  178.   delete card;
  179.   return 0;
  180. }
  181.